import java.lang.reflect.Array;
import java.util.Collection;
import java.util.Map;

import org.apache.commons.lang3.StringUtils;

/**
 * mybaits 参数判断
 * 
 * <pre>
 *      &lt;if test="@Ognl@isNotEmpty(userId)">
 *              and user_id = #{userId}
 *      &lt;/if>
 * </pre>
 * 
 * @author lizx
 * 
 */
public class Ognl {

	/**
	 * 检查字符串，集合，映射表是否为空
	 * 
	 * @param o
	 *            检查对象
	 * @return
	 */
	@SuppressWarnings("rawtypes")
	public static boolean isEmpty(Object o) {
		if (o == null)
			return true;

		if (o instanceof String) {
			return ((String) o).length() == 0;
		} else if (o instanceof Collection) {
			return ((Collection) o).isEmpty();
		} else if (o.getClass().isArray()) {
			return Array.getLength(o) == 0;
		} else if (o instanceof Map) {
			return ((Map) o).isEmpty();
		}

		return false;
	}

	public static boolean isNotEmpty(Object o) {
		return !isEmpty(o);
	}

	public static boolean isNotBlank(Object o) {
		return !isBlank(o);
	}

	/**
	 * 检查对象是否为数字类型
	 * 
	 * @param o
	 *            检查对象
	 * @return
	 */
	public static boolean isNumber(Object o) {
		if (o == null)
			return false;
		if (o instanceof Number) {
			return true;
		}
		if (o instanceof String) {
			String str = (String) o;
			if (str.length() == 0)
				return false;
			if (str.trim().length() == 0)
				return false;
			return org.apache.commons.lang.StringUtils.isNumeric(str);
		}
		return false;
	}

	/**
	 * 检查对象是否为空白，如果对象部位字符串类型则返回false
	 * 
	 * @param o
	 *            检查对象
	 * @return
	 */
	public static boolean isBlank(Object o) {
		if (o == null)
			return true;
		if (o instanceof String) {
			String str = (String) o;
			return isBlank(str);
		}
		return false;
	}

	/**
	 * <p>
	 * 检查字符串是否为空白
	 * </p>
	 * 
	 * <pre>
	 * isBlank(null)      = true
	 * isBlank("")        = true
	 * isBlank(" ")       = true
	 * isBlank("bob")     = false
	 * isBlank("  bob  ") = false
	 * </pre>
	 * 
	 * @param cs
	 *            被检查的字符串
	 * @return {@code true} 如否不为空返回true
	 */
	public static boolean isBlank(CharSequence cs) {
		return StringUtils.isBlank(cs);
	}

}
